﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Obligatorio1;
using Obligatorio1.Modelo;
using System.DirectoryServices;
using System.IO;


namespace Agenda
{
    public partial class frmPersona : Form
    {
        #region "Constructores"
        private frmPersona(Persona _persona, Modo _modo)
        {
            InitializeComponent();
            this.persona = _persona;
            this.modoActual = _modo;

            //Cargamos los tipos de direccion
            comboBox2.DataSource = ManejadorTipoDireccion.getInstance().listar();
            comboBox2.ValueMember = "nombre";

        }
        #endregion
        #region"Properties"
        private static frmPersona instance = null;
        private Persona persona;
        private Modo modoActual;
        private Char agregar;
        #endregion
        #region "Eventos"
        private void btnAddEmail_Click(object sender, EventArgs e)
        {
            try
            {
                this.AcomodarPanel(true, "E-mail");
                //Cargamos los tipos de email
                comboBox1.DataSource = ManejadorTipoEmail.getInstance().listar();
                comboBox1.ValueMember = "nombre";
                agregar = 'e';
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
        private void btnAddDireccion_Click(object sender, EventArgs e)
        {
            try
            {
                this.pnlAgregar.Visible = false;
                this.pnlDireccion.Visible = true;
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
        private void btnAddTelefono_Click(object sender, EventArgs e)
        {
            try
            {
                this.AcomodarPanel(true, "Teléfono");
                //Cargamos los tipos de telefono
                comboBox1.DataSource = ManejadorTipoTelefono.getInstance().listar();
                comboBox1.ValueMember = "nombre";
                agregar = 't';
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
        private void btnAddGrupo_Click(object sender, EventArgs e)
        {
            try
            {
                AcomodarPanel(false, "Grupo");
                lblTipo.Text = "Grupo";
                //Cargamos los grupos
                comboBox1.DataSource = ManejadorGrupo.getInstance().listar();
                comboBox1.ValueMember = "nombre";
                agregar = 'g';
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void btnAddDir_Click(object sender, EventArgs e)
        {
            if (persona != null)
            {
                if (!textBox3.Text.Equals(""))
                {
                    Direccion d = new Direccion();
                    d.direccion = textBox3.Text;
                    d.idPersona = persona.id;
                    d.tipo = ((TiposDireccion)(comboBox2.Items[comboBox2.SelectedIndex])).nombre;

                    if (!textBox4.Text.Equals("")) { d.ciudad = textBox4.Text; }
                    if (!textBox5.Text.Equals("")) { d.pais = textBox5.Text; }
                    if (!textBox6.Text.Equals("")) { d.codigoPostal = int.Parse(textBox6.Text); }

                    if (!ManejadorPersona.getInstance().contieneDrireccion(persona, d))
                    {
                        ManejadorPersona.getInstance().agergarDireccion(persona, d);
                    }
                    else
                    {
                        MessageBox.Show("Ya se ha agregado esa direccion para esta persona.", "Mensaje de advertencia");
                    }
                }
                else 
                {
                    MessageBox.Show("La direccin no puede ser vacia.", "Mensaje de advertencia");
                }
            }
            else 
            {
                MessageBox.Show("Ingrese primero los datos basicos para la persona y confirme. Luego podra"
                                    + " agregar email, direccion, telefonos y grupos.", "Mensaje de advertencia");
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            try
            {
                if (persona != null)
                {
                    if (agregar == 'e')
                    {
                        if (!txtAgregarNombre.Text.Equals(""))
                        {                              
                            //Lo que vamos a agregar es un email
                            Email em = new Email();
                            em.idPersona = persona.id;
                            em.email = txtAgregarNombre.Text;
                            em.tipo = ((TiposEmail)(comboBox1.Items[comboBox1.SelectedIndex])).nombre;
                            if (!ManejadorPersona.getInstance().contieneEmail(persona, em))
                            { 
                                ManejadorPersona.getInstance().agergarEmail(persona, em);
                            }
                            else
                            {
                                MessageBox.Show("La persona ya contiene ese email.", "Mensaje de advertencia");
                            }
                        }
                        else 
                        {
                            MessageBox.Show("Debe ingresar el email.", "Mensaje de advertencia");
                        }
                    }
                    else
                    {
                        if (agregar == 't')
                        {
                            if (!txtAgregarNombre.Text.Equals(""))
                            {
                                //Lo que vamos a agregar es un telefono
                                Telefono t = new Telefono();
                                t.idPersona = persona.id;
                                t.numero = txtAgregarNombre.Text;
                                t.tipo = ((TiposTelefono)(comboBox1.Items[comboBox1.SelectedIndex])).nombre;
                                if (!ManejadorPersona.getInstance().contieneTelefono(persona, t))
                                { 
                                    ManejadorPersona.getInstance().agergarTelefono(persona, t);
                                }
                                else
                                {
                                    MessageBox.Show("La persona ya contiene ese telefono.", "Mensaje de advertencia");
                                }
                            }
                            else
                            {
                                MessageBox.Show("Debe ingresar el telefono.", "Mensaje de advertencia");
                            }
                        }
                        else
                        {
                            //Lo que vamos a agregar es un grupo
                            Grupo g = (Grupo)(comboBox1.Items[comboBox1.SelectedIndex]);
                            if (!ManejadorPersona.getInstance().contieneGrupo(persona, g))
                            {
                                ManejadorPersona.getInstance().agergarGrupo(persona, g);

                            }
                            else
                            {
                                MessageBox.Show("La persona ya forma parte de ese grupo.", "Mensaje de advertencia");
                            }
                        }
                    }
                }

                else
                {
                    MessageBox.Show("Ingrese primero los datos basicos para la persona y confirme. Luego podra"
                                    + " agregar email, direccion, telefonos y grupos.", "Mensaje de advertencia");
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
            
        }

        //DEL

        private void btnDelEmail_Click(object sender, EventArgs e)
        {
            try
            {
                if (gvEmail.Rows.Count > 0)
                {
                    Email email = gvEmail.Rows[gvEmail.CurrentCell.RowIndex].DataBoundItem as Email;
                    ManejadorPersona.getInstance().borrarEmail(email);
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
        private void btnDelDireccion_Click(object sender, EventArgs e)
        {
            try
            {
                if (gvDireccion.Rows.Count > 0)
                {
                    Direccion direccion = gvDireccion.Rows[gvDireccion.CurrentCell.RowIndex].DataBoundItem as Direccion;
                    ManejadorPersona.getInstance().borrarDireccion(direccion);
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
        private void btnDelTelefono_Click(object sender, EventArgs e)
        {
            try
            {
                if (gvTelefono.Rows.Count > 0)
                {
                    Telefono telefono = gvTelefono.Rows[gvTelefono.CurrentCell.RowIndex].DataBoundItem as Telefono;
                    ManejadorPersona.getInstance().borrarTelefono(telefono);
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
        private void btnDelGrupo_Click(object sender, EventArgs e)
        {
            try
            {
                if (gvGrupo.Rows.Count > 0)
                {
                    Grupo grupo = gvGrupo.Rows[gvGrupo.CurrentCell.RowIndex].DataBoundItem as Grupo;
                    ManejadorPersona.getInstance().borrarGrupo(this.persona, grupo);
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        // OTROS

        private void frmPersona_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                e.Cancel = true;
                this.Hide();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void buttonEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                ManejadorPersona.getInstance().borrarPersona(persona);
                frmAgenda.getInstance().CargarAgenda();
                this.Hide();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
        private void buttonConfirmar_Click(object sender, EventArgs e)
        {
            try
            {
                if (persona == null)
                {
                    if (!txtNombre.Text.Equals("") && !txtApellido.Text.Equals(""))
                    {
                        //Vamos a agregar una persona
                        Persona p = new Persona();
                        p.nombre = txtNombre.Text;
                        p.apellido = txtApellido.Text;
                        p.comentario = txtComenario.Text;
                        p.fechaNacimiento = dtpFechaNac.Value;
                        p.foto = getPicture(pictureBox1.ImageLocation);
                        ManejadorPersona.getInstance().agergarPersona(p);
                        frmAgenda.getInstance().CargarAgenda();
                        this.Hide();
                    }
                    else
                    {
                        MessageBox.Show("Ingrese nombre y apellido para la persona", "Mensaje de advertencia");
                    }
                }
                else
                {
                    //Si modo es Modificacion
                    if (modoActual == Modo.Modificacion)
                    {
                        //Vamos a agregar una persona
                        ManejadorPersona.getInstance().modificarPersona(persona, txtNombre.Text, txtApellido.Text, txtComenario.Text, dtpFechaNac.Value, getPicture(pictureBox1.ImageLocation));
                        frmAgenda.getInstance().CargarAgenda();
                    }                    
                    this.Hide();
                }                
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
        
        private void btnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                this.modoActual = Modo.Modificacion;
                this.btnModificar.Visible = false;
                this.btnConfirmar.Visible = true;
                this.CargarPersona();
                this.txtNombre.Focus();
                visualizarLinkFoto(true);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                pnlAgregar.Visible = false;
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                pnlDireccion.Visible = false;
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
        private void lnkCargarImagen_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            try
            {
                OpenFileDialog openFileDialog1 = new OpenFileDialog();

                openFileDialog1.InitialDirectory = "C:\\";
                openFileDialog1.Filter = "Images (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF";
                openFileDialog1.Multiselect = false;
                openFileDialog1.RestoreDirectory = true;

                if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    this.pictureBox1.ImageLocation = openFileDialog1.FileName;
                    this.pictureBox1.Show();
                    lnkCargarImagen.Text = "Cambiar imagen";
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
        #endregion
        #region "Metodos"
        #region "Privados"

        private void AcomodarPanel(bool value, string tipo)
        {
            lblNombre.Text = tipo;
            pnlAgregar.Visible = true;
            this.pnlDireccion.Visible = false;
            lblNombre.Visible = value;
            txtAgregarNombre.Visible = value;
            lblTipo.Text = "Tipo";
        }

        private void AcomodarGrillas()
        {
            if (gvEmail.Columns.Count > 0)
            {
                //Acomodamos la grilla email
                gvEmail.Columns[0].Visible = false;
                gvEmail.Columns[3].Visible = false;
                gvEmail.Columns[4].Visible = false;

                gvEmail.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            }

            if (gvDireccion.Columns.Count > 0)
            {
                //Acomodamos la grilla direccion
                gvDireccion.Columns[5].Visible = false;
                gvDireccion.Columns[6].Visible = false;
                gvDireccion.Columns[7].Visible = false;

                gvDireccion.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            }

            if (gvTelefono.Columns.Count > 0)
            {
                //Acomodamos la grilla telefono
                gvTelefono.Columns[2].Visible = false;
                gvTelefono.Columns[3].Visible = false;
                gvTelefono.Columns[4].Visible = false;

                gvTelefono.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                gvTelefono.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

            }

            if (gvGrupo.Columns.Count > 0)
            {
                //Acomodamos la grilla grupo
                gvGrupo.Columns[1].Visible = false;
                gvGrupo.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            }
        }

        private void cargarModificacion()
        {
            this.dtpFechaNac.MaxDate = System.DateTime.Now;
            this.txtNombre.Text = this.persona.nombre;
            this.txtApellido.Text = this.persona.apellido;
            this.dtpFechaNac.Value = this.persona.fechaNacimiento;
            this.gvEmail.DataSource = this.persona.Email;
            this.gvDireccion.DataSource = this.persona.Direccion;
            this.gvTelefono.DataSource = this.persona.Telefono;
            this.txtComenario.Text = this.persona.comentario;
            this.gvGrupo.DataSource = this.persona.Grupo;
            if (this.persona.foto != null)
            {
                this.pictureBox1.Image = CargarImagen(this.persona.foto);
            }

            AcomodarGrillas();
        }
        private void ModoLectura(bool status)
        {
            this.txtNombre.ReadOnly = status;
            this.txtApellido.ReadOnly = status;
            this.dtpFechaNac.Enabled = !status;
            this.gvEmail.ReadOnly = status;
            this.gvDireccion.ReadOnly = status;
            this.gvTelefono.ReadOnly = status;
            this.txtComenario.ReadOnly = status;
            this.btnAddDireccion.Visible = !status;
            this.btnAddEmail.Visible = !status;
            this.btnAddGrupo.Visible = !status;
            this.btnAddTelefono.Visible = !status;
            this.btnDelDireccion.Visible = !status;
            this.btnDelEmail.Visible = !status;
            this.btnDelGrupo.Visible = !status;
            this.btnDelTelefono.Visible = !status;
            this.btnModificar.Visible = status;
            visualizarLinkFoto(!status);
            AcomodarGrillas();
        }
        private void cargarNuevo()
        {
            this.dtpFechaNac.MaxDate = System.DateTime.Now;
            this.txtNombre.Text = "";
            this.txtApellido.Text = "";
            this.dtpFechaNac.Value = System.DateTime.Now;
            this.gvEmail.DataSource = null;
            this.gvDireccion.DataSource = null;
            this.gvTelefono.DataSource = null;
            this.txtComenario.Text = "";
            this.gvGrupo.DataSource = null;
            this.btnModificar.Visible = false;
            this.btnConfirmar.Visible = true;
            this.visualizarLinkFoto(true);
        }
        private void limpiar()
        {
            pnlAgregar.Visible = false;
            pnlDireccion.Visible = false;
            this.pictureBox1.Image = null;
        }

        private byte[] getPicture(String path)
        {
            byte[] picbyte = null;
            FileStream fs;
            if (path != null)
            {
                fs = new FileStream(path, FileMode.Open, FileAccess.Read);

                //a byte array to read the image

                picbyte = new byte[fs.Length];

                fs.Read(picbyte, 0, System.Convert.ToInt32(fs.Length));

                fs.Close();
            }
            return picbyte;
        }

        private Image CargarImagen(byte[] picbyte)
        {
            MemoryStream ms = new MemoryStream(picbyte);
            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }

        private void visualizarLinkFoto(bool status)
        {
            this.lnkCargarImagen.Visible = status;
            if (status)
            {
                if (persona == null || persona.foto != null)
                {
                    this.lnkCargarImagen.Text = "Cargar imagen";
                }
                else
                {
                    this.lnkCargarImagen.Text = "Cambiar imagen";
                }
            }
        }

        #endregion
        #region "Publicos"
        public static frmPersona getInstance(Persona _persona, Modo _modo)
        {
            if (instance == null)
            {
                instance = new frmPersona(_persona, _modo);
            }
            else
            {
                instance.persona = _persona;
                instance.modoActual = _modo;
            }
            return instance;
        }
        public void CargarPersona()
        {
            limpiar();
            switch (modoActual)
            {
                case Modo.Nuevo:
                    cargarNuevo();
                    ModoLectura(false);
                    break;
                case Modo.Modificacion:
                    cargarModificacion();
                    ModoLectura(false);
                    break;
                case Modo.Lectura:
                    cargarModificacion();
                    ModoLectura(true);
                    break;
            }
            this.Show();
        }
        #endregion
        #endregion
        #region "Enums"
        public enum Modo
        {
            Nuevo = 0,
            Lectura = 1,
            Modificacion = 2

        }
        #endregion
    }
}
